/*
 *  linux/lib/open.c
 *
 *  open()系统调用用于将一个文件名转换成一个文件描述符。当调用成功时，返回的文件描述符
 * 将是进程没有打开的最小数值的描述符。该调用创建一个新的打开文件，并不与任何其它进程
 * 共享。在执行exec函数时，该新的文件描述符将始终保持着打开状态。文件的读写指针被设置
 * 在文件开始位置。参数flag 是0_RDONLY、O_WRONLY、O_RDWR 之一，分别代表文件只读打开、只
 * 写打开和读写打开方式，可以与其它一些标志一起使用。(参见fs/open.c，138 行)
 */

#define __LIBRARY__
#include <unistd.h>
#include <stdarg.h>

// 打开文件描述符
// flags的值：O_RDONLY, O_WRONLY, O_RDWR
// 第三个参数：在创建文件时，可传递文件的权限
int open(const char * filename, int flag, ...)
{
	register int res;
	va_list arg;

	va_start(arg,flag);

	// 注意，这里并没有传可变参数进去，而只取了3个参数
	__asm__ __volatile__("int $0x80"
		:"=a" (res)
		:"0" (__NR_open),"b" (filename),"c" (flag),	// 打开标志：O_RDONLY等。0-即=a相同的值，ax
		"d" (va_arg(arg,int)));			// 取第三个参数，如文件创建时可用于设置初始权限
	if (res>=0)
		return res;
	errno = -res;		// 出错，记录错误码
	return -1;
}
